
use std::fmt::{self, Formatter, Display};

pub struct City {
    pub name: &'static str,
    // 纬度
    pub lat: f32,
    // 经度
    pub lon: f32,
}

impl Display for City {
    // `f` 是一个缓冲区（buffer），此方法必须将格式化后的字符串写入其中
    fn fmt(&self, f: &mut Formatter) -> fmt::Result {
        let lat_c = if self.lat >= 0.0 { 'N' } else { 'S' };
        let lon_c = if self.lon >= 0.0 { 'E' } else { 'W' };

        // `write!` 和 `format!` 类似，但它会将格式化后的字符串写入
        // 一个缓冲区（即第一个参数f）中。
        write!(f, "{}: {:.3}°{} {:.3}°{}",
               self.name, self.lat.abs(), lat_c, self.lon.abs(), lon_c)
    }
}

// #[derive(Debug)]
pub struct Color {
    pub red: u8,
    pub green: u8,
    pub blue: u8,
}

impl Display for Color{
    fn fmt(&self,  f: &mut Formatter) -> fmt::Result {
        let mut c = self;
        let u24=U24::from_le_bytes(c);
        write!(f, "RGB ({}, {}, {}) {:#X}", self.red, self.green, self.blue,u24.value())
    }
}


#[repr(transparent)] // 内存布局与 u32 一致
#[derive(Debug)]
struct U24(u32);

impl U24 {
    pub fn from_le_bytes(c : &Color) -> Self {
        U24(
            (c.red as u32) << 16 |
                (c.green as u32) << 8  |
                (c.blue as u32)
        )
    }

    pub fn value(&self) -> u32 {
        self.0 & 0xFFFFFF // 确保仅保留24位
    }
}